﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using SisEagle.View.Web.Controle;
using SisEagle.IView.Seguranca;
using System.Data;
using SisEagleVO;
using SisEagle.View.Web.Base;
using System.Web.Security;
using SisEagle.Business;
using SisEagle.Business.Resouce;

namespace SisEagle.View.Web.Seguranca
{
    public partial class Login : Base.WebPageBase, ILoginView
    {

        #region Singleton
        private SisEagleBO.FuncionarioBO _FuncionarioBusiness;
        private SisEagleBO.FuncionarioBO FuncionarioBusiness
        {
            get
            {
                if (_FuncionarioBusiness == null)
                    _FuncionarioBusiness = new SisEagleBO.FuncionarioBO();

                return _FuncionarioBusiness;
            }
        }

        #endregion

        #region OnInit
        protected override void OnInit(EventArgs e)
        {
                base.OnInit(e);
                Login1.Authenticate += (Login1_Authenticate);
        }
        #endregion

        #region Actions
        void Login1_Authenticate(object sender, AuthenticateEventArgs e)
        {
            if (string.IsNullOrWhiteSpace(Login1.UserName) || string.IsNullOrWhiteSpace(Login1.Password))
            {
                Login1.FailureText = MensagensSistema.LoginErroUsuario;
                e.Authenticated = false;
                return;
            }
            //Valida os Dados de Entrada
            else if (ValidarDados(Usuario, Senha))
            {
              var usuario =  BuscaFuncionario();

              if (usuario != null)
              {
                  e.Authenticated = true;
                  FormsAuthentication.RedirectFromLoginPage(Login1.UserName, false);

              }
            }
           
            else
            {
                
                Login1.FailureText = MensagensSistema.LoginErroUsuario;
                FormsAuthentication.SignOut();
                e.Authenticated = false;
                return;
            }
        }


        #endregion

        #region Internal

        /// <summary>
        /// Busca o Funcionario Que foi requisitado pela senha e CPF
        /// </summary>
        /// <returns></returns>
        private FuncionarioVO BuscaFuncionario()
        {
            //Busca o DataSet no Banco
            DataSet FuncionarioData = FuncionarioBusiness.BuscarFuncionario(Senha, Usuario);

            //Seleciona a tabela de Funcionario
            var funcionario = FuncionarioData.Tables["Funcionario"];

            //Carrega as informaciones necessarias
            var FuncionarioACarregar = CarregaFuncionario(funcionario);

            //existir dados na tabela
            if (funcionario != null)
            {
                // se nao contem erros
                if (!funcionario.HasErrors)
                {

                    // se o funcionario buscado do banco for nullo
                    if (FuncionarioACarregar == null)
                    {
                        Login1.InstructionText = "Senha ou CPF invalidos";
                        Login1.FailureText = MensagensSistema.LoginErroUsuario;
                        Login1.InstructionText = "teste";
                        FormsAuthentication.SignOut();
                        
                        
                        return null;
                    }
                    else
                    {
                        //carrega ele no sistema
                        CarregaSecaoUsuario(FuncionarioACarregar);
                    }
                }
                
            }
            //retorna o funcionario
            return FuncionarioACarregar;

        }
        /// <summary>
        /// Registra o usuario na Aplicaçao
        /// </summary>
        /// <param name="FuncionarioACarregar"></param>
        private void CarregaSecaoUsuario(FuncionarioVO FuncionarioACarregar)
        {
            Registrausuario(FuncionarioACarregar);



            // carrega o funcionario na sessao 
            if (FuncionarioACarregar != null)
            {
                InformacoesUsuario = FuncionarioACarregar;

            }

        }

        /// <summary>
        /// Registra o usuario na autentificacao do servidor  
        /// Cria um  Cookies e criptografa seu valor
        /// </summary>
        /// <param name="funcionario"></param>
        private void Registrausuario(FuncionarioVO funcionario)
        {
            FormsAuthentication.Initialize();

            FormsAuthenticationTicket Forms = new FormsAuthenticationTicket(1, funcionario.Nome, DateTime.Now,
             DateTime.Now.AddMinutes(20), false, Usuario, FormsAuthentication.FormsCookiePath);
            Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(Forms)));


        }


        /// <summary>
        /// Carrega a entidade FuncionarioVO com os dados Recebidos do Banco
        /// </summary>
        /// <param name="funcionario"></param>
        /// <returns>Funcionario</returns>
        private FuncionarioVO CarregaFuncionario(DataTable funcionario)
        {

            if (funcionario.Rows.Count != 0)
            {
                FuncionarioVO func = new FuncionarioVO
                {
                    CodFuncionario = Convert.ToInt32(funcionario.Rows[0]["CodFuncionario"].ToString() == null ? "0" : funcionario.Rows[0]["CodFuncionario"].ToString()),
                    Nome = funcionario.Rows[0]["Nome"].ToString() ?? string.Empty,
                    Endereco = funcionario.Rows[0]["Endereco"].ToString() ?? string.Empty,
                    codPrevilegio = Convert.ToInt32(funcionario.Rows[0]["codPrevilegio"].ToString() == null ? "0" : funcionario.Rows[0]["codPrevilegio"].ToString()),
                    NomeCidade = funcionario.Rows[0]["NomeCidade"].ToString() ?? string.Empty,
                    TelefoneRes = funcionario.Rows[0]["TelefoneRes"].ToString() ?? string.Empty,
                    Bairro = funcionario.Rows[0]["Bairro"].ToString() ?? string.Empty,
                    TelefoneCel = funcionario.Rows[0]["TelefoneCel"].ToString() ?? string.Empty,
                    Email = funcionario.Rows[0]["Email"].ToString() ?? string.Empty,
                    codEstado = Convert.ToInt32(funcionario.Rows[0]["codEstado"].ToString() == null ? "0" : funcionario.Rows[0]["codEstado"].ToString())
                };

                return func;

            }
            else
            {
                return null;
            }

        }


        #endregion

        #region Validacao
        /// <summary>
        /// Valida os dados Recebidos do Usuario
        /// </summary>
        /// <param name="Usuario"></param>
        /// <param name="Senha"></param>
        /// <returns></returns>
        private bool ValidarDados(string Usuario, string Senha)
        {
            if (UtilsNumber.ValidaCPF(Usuario))
            {
                var usuario = UtilsNumber.FormataTexto(Usuario);
                var senha = UtilsNumber.FormataTexto(Senha);



                return true;
            }
            else
            {
                return false;
            }



        }

        #endregion

        #region Propriedades
        public string Usuario
        {
            get
            {
                if (string.IsNullOrWhiteSpace(Login1.UserName))
                    return string.Empty;

                else
                {
                    if (UtilsNumber.ValidaCPF(Login1.UserName.TrimStart()))
                    {
                        return UtilsNumber.FormataTexto(Login1.UserName.TrimStart());
                    }
                    else
                    {
                        Login1.FailureText = SisEagle.Business.Resouce.MensagensSistema.LoginErroUsuario;
                        return string.Empty;
                    }

                }
            }
        }

        public string Senha
        {
            get
            {
                return (UtilsNumber.FormataTexto(Login1.Password));

            }

        }

        public FuncionarioVO InformacoesUsuario
        {
            get
            {
                return Session["Usuario"] as FuncionarioVO;
            }
            set
            {
                Session["Usuario"] = value;
            }
        }

        #endregion

    }
}